/**
 * kl yy-ds @2021
 */
package com.cxps.cloud.utils;

import org.apache.poi.util.IOUtils;
import org.jxls.common.Context;
import org.jxls.util.JxlsHelper;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;

/**
 * 导出工具类
 *
 * @author YouCai.Liu
 * @since 2021/10/21
 * ...
 */
public class ExportUtils<T> {

    /**
     * jxls 技术导出，首先构建要导出的文件
     *
     * @param entityList       要导出的数据集合
     * @param fileTemplatePath 导出的文件模板
     * @param exportLocation   导出的文件位置
     * @param fileName         导出的文件名
     * @return
     */
    public String buildFile(List<T> entityList, String fileTemplatePath, String exportLocation, String fileName) {
        // 获取输入输出流
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            // 读取模板到输入流
            fis = new FileInputStream(fileTemplatePath);

            // 判断要导出的目录是否存在，不存在就创建
            File file = new File(exportLocation);
            if (!file.exists()) {
                file.mkdirs();
            }

            // 指定文件输出流
            fos = new FileOutputStream(exportLocation + fileName);

            // jxls 上下文
            Context context = new Context();

            // dataList 对应批注命令里的  items = "dataList"  ---》  jx:each(items = "dataList" var = "data" lastCell = "I2")
            context.putVar("dataList", entityList);

            // 通过流转换，提取数据 输出文件
            JxlsHelper.getInstance().processTemplate(fis, fos, context);

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fos != null) {
                    fos.close();
                }
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return fileName;
    }

    /**
     * 导出数据
     *
     * @param response          响应
     * @param exportLocation    导出的文件位置
     * @param fileName          导出的文件名
     */
    public void exportData(HttpServletResponse response, String exportLocation, String fileName) {
        File file = new File(exportLocation + fileName);
        // 获取输入输出流
        FileInputStream fis1 = null;
        ServletOutputStream sos = null;
        try {
            // 获取结果文件输出流
            fis1 = new FileInputStream(file);
            // 设置响应信息
            response.reset();
            response.setContentType("application/x-msdownload; charset=utf-8");
            response.setHeader("Set-Cookie", "fileDownload=true; path=/");
            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "utf-8"));
            sos = response.getOutputStream();
            IOUtils.copy(fis1, sos);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fis1 != null) {
                    fis1.close();
                }
                if (sos != null) {
                    sos.close();
                }
                file.delete();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


}
